﻿using LM.InterfacesFabricas.Interfaces.Repositorios;
using LM.Negocio.Objetos;
using System;
using System.Linq;

namespace LM.Negocio.Validadores
{
    public class ValidadorDeTabelaPreco : ValidadorAbastrato
    {
        private TabelaDePreco _objetoValidado;
        private IRepositorioDeConsultaDeObjetos<TabelaDePreco> _repositorioDeTabelaPreco;

        public ValidadorDeTabelaPreco( IRepositorioDeConsultaDeObjetos<TabelaDePreco> repositorioDeTabelaPreco )
        {
            if ( repositorioDeTabelaPreco == null )
                throw new ArgumentNullException( "repositorioDeTabelaPreco" );

            _repositorioDeTabelaPreco = repositorioDeTabelaPreco;
        }

        public void ValideCadastro( TabelaDePreco tabela )
        {
            if ( tabela == null )
                throw new ArgumentException( "tabelaPreco" );

            _objetoValidado = tabela;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideNomeNaoInformado();
            ValideDataInicioNaoInformado();
            ValideDataFinalNaoInformado();
            ValideTabelaPrecoJaCadastrada();

            base.GarantaSucesso();
        }

        public void ValideAtualizacao( TabelaDePreco tabela )
        {
            if ( tabela == null )
            {
                throw new ArgumentException( "tabelaPreco" );
            }

            _objetoValidado = tabela;
            base.LimpeInconsistencias();

            ValideCodigoNaoInformado();
            ValideNomeNaoInformado();
            ValideDataInicioNaoInformado();
            ValideDataFinalNaoInformado();
            ValideTabelaPrecoNaoCadastrada();

            base.GarantaSucesso();
        }

        public void ValideExclusao( TabelaDePreco tabela )
        {
            if ( tabela == null )
            {
                throw new ArgumentException( "tabelaPreco" );
            }

            _objetoValidado = tabela;
            base.LimpeInconsistencias();
            ValideTabelaPrecoNaoCadastrada();
            base.GarantaSucesso();
        }

        private void ValideCodigoNaoInformado()
        {
            if ( _objetoValidado.Codigo == 0 )
                AdicioneInconsistencia( "Código não informado." );
        }

        private void ValideNomeNaoInformado()
        {
            if ( String.IsNullOrWhiteSpace( _objetoValidado.Nome ) )
                AdicioneInconsistencia( "Nome não informado." );
        }

        private void ValideDataInicioNaoInformado()
        {
            if ( string.IsNullOrWhiteSpace( _objetoValidado.DataInicial.ToString().Trim() ) )
                AdicioneInconsistencia( "Data início não informado." );
        }

        private void ValideDataFinalNaoInformado()
        {
            if ( string.IsNullOrWhiteSpace( _objetoValidado.DataFinal.ToString().Trim() ) )
                AdicioneInconsistencia( "Data final não informado." );
        }

        private bool TabelaPrecoJaCadastrada()
        {
            return _repositorioDeTabelaPreco.Consulte( m => m.Codigo == _objetoValidado.Codigo ).Any();
        }

        private void ValideTabelaPrecoJaCadastrada()
        {
            if ( TabelaPrecoJaCadastrada() )
                AdicioneInconsistencia( "Já existe uma Tabela de Preço cadastrada com o código {0}.", _objetoValidado.Codigo );
        }

        private void ValideTabelaPrecoNaoCadastrada()
        {
            if ( !TabelaPrecoJaCadastrada() )
                AdicioneInconsistencia( "Tabela de Preço com o código {0} não cadastrado.", _objetoValidado.Codigo );
        }
    }
}
